﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OcenyOpisowe.Core.Data;

namespace OcenyOpisowe.Core.Repositories
{
	/// <summary>
	/// Interfejs dla repozytorium nauczycieli.
	/// Udostępnia funkcjonalność dodawania, usuwania, pobierania i wyszukiwania nauczycieli
	/// dodanych do bazy danych szkoły.
	/// </summary>
	public interface ITeachersRepository
	{
		/// <summary>
		/// Pobiera pracownika po identyfikatorze.
		/// </summary>
		/// <param name="identifier">Identyfikator pracownika do pobrania.</param>
		/// <returns>Pobrany pracownik.</returns>
		Teacher this[int identifier] { get; }

		/// <summary>
		/// Metoda dodająca nowego pracownika do repozytorium.
		/// </summary>
		/// <param name="teacher">Pracownik do dodania.</param>
		void Add(Teacher teacher);

		/// <summary>
		/// Metoda usuwająca nauczyciela z bazy danych nauczycieli.
		/// </summary>
		/// <param name="teacher">Nauczyciel do usunięcia z bazy danych.</param>
		void Delete(Teacher teacher);

		/// <summary>
		/// Metoda wyszukująca pracownika po loginie.
		/// </summary>
		/// <param name="teacherLogin">Login pracownika do znalezienia.</param>
		/// <returns>Znaleziony nauczyciel bądź null jeżeli nie ma takiego typa.</returns>
		Teacher FindTeacherByLogin(string teacherLogin);

		/// <summary>
		/// Metoda pobierająca wszystkich pracowników dodanych do bazy danych szkoły.
		/// </summary>
		/// <returns>Kolekcja wszystkich pracowników dodanych do bazy danych szkoły.</returns>
		IEnumerable<Teacher> GetAllTeachers();

		/// <summary>
		/// Metoda zapisująca dane nauczyciela na bazę danych. Nie dodaje ona nowych nauczycieli
		/// lecz tylko nadpisuje dane istniejącego nauczyciela o tym samym samym identyfikatorze
		/// co nauczyciel podany w argumencie <c>teacher</c>.
		/// </summary>
		/// <param name="teacher">Nauczyciel do nadpisania.</param>
		void Update(Teacher teacher);
	}
}
